From c7f3f82a650f3c749b50e6923cfaf26d9e4719c5 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 3 Mar 2011 17:46:44 +0000 Subject: [PATCH] x86, libxc: Fix xc_translate_foreign_address() for PV guests of different bitness than dom0 (32-bit vs 64-bit). Original patch by: Paolo Bonzini Signed-off-by: Keir Fraser --- tools/include/xen-foreign/structs.py | 1 + tools/libxc/xc_pagetab.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/include/xen-foreign/structs.py b/tools/include/xen-foreign/structs.py index a1bc055a19..964829c534 100644 --- a/tools/include/xen-foreign/structs.py +++ b/tools/include/xen-foreign/structs.py @@ -53,6 +53,7 @@ defines = [ "__i386__", # all archs "xen_pfn_to_cr3", + "xen_cr3_to_pfn", "XEN_LEGACY_MAX_VCPUS", "MAX_GUEST_CMDLINE" ]; diff --git a/tools/libxc/xc_pagetab.c b/tools/libxc/xc_pagetab.c index 428c7fee97..b19a42c8af 100644 --- a/tools/libxc/xc_pagetab.c +++ b/tools/libxc/xc_pagetab.c @@ -61,11 +61,12 @@ unsigned long xc_translate_foreign_address(xc_interface *xch, uint32_t dom, return 0; if (domctl.u.address_size.size == 64) { pt_levels = 4; - paddr = ctx.x64.ctrlreg[3] & ~0xfffull; + paddr = (uint64_t)xen_cr3_to_pfn_x86_64(ctx.x64.ctrlreg[3]) + << PAGE_SHIFT; } else { pt_levels = 3; - paddr = (((uint64_t) xen_cr3_to_pfn(ctx.x32.ctrlreg[3])) - << PAGE_SHIFT); + paddr = (uint64_t)xen_cr3_to_pfn_x86_32(ctx.x32.ctrlreg[3]) + << PAGE_SHIFT; } } -- 2.30.2